package com.sky.controller.admin;

import com.sky.dto.OrdersCancelDTO;
import com.sky.dto.OrdersDTO;
import com.sky.dto.OrdersPageQueryDTO;
import com.sky.dto.OrdersRejectionDTO;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.OrdersService;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/admin/order")
@Slf4j
@Api(tags = "后台-订单管理", description = "后台-订单管理")
@RequiredArgsConstructor//生成构造函数，注入相关类
@CrossOrigin(origins = "*", maxAge = 3600)//解决跨域问题
public class OrderController {
    private final OrdersService ordersService;//注入订单服务类


    /**
     * ## 订单搜索
     * <p>
     * <a id=订单搜索> </a>
     * <p>
     * ### 基本信息
     * <p>
     * **Path：** /admin/order/conditionSearch
     * <p>
     * **Method：** GET
     * <p>
     * **接口描述：**
     * <p>
     * <p>
     * ### 请求参数
     * <p>
     * **Query**
     */
    @ApiOperation(value = "订单搜索", notes = "根据订单号,用户手机号,订单状态,下单开始时间,下单结束时间进行条件分页查询")
    @GetMapping("/conditionSearch")
    public Result<PageResult> conditionSearch(OrdersPageQueryDTO ordersPageQueryDTO) {
        //记录日志
        log.info("订单搜索,ordersPageQueryDTO={}", ordersPageQueryDTO);
        //业务:订单数据的条件分页查询
        PageResult pageResult = ordersService.pageQueryByCondition(ordersPageQueryDTO);
        //返回统一的响应结果
        return Result.success(pageResult);
    }


    /**
     * ## 各个状态的订单数量统计
     *
     * <a id=各个状态的订单数量统计> </a>
     * <p>
     * ### 基本信息
     * <p>
     * **Path：** /admin/order/statistics
     * <p>
     * **Method：** GET
     * <p>
     * **接口描述：**
     *
     * <p>
     * <p>
     * ### 请求参数:无
     */
    //待接单,待派送,派送中的订单数量统计
    @ApiOperation(value = "各个状态的订单数量统计", notes = "实现根据订单状态统计各种状态的订单数量")
    @GetMapping("/statistics")
    public Result<OrderStatisticsVO> statistics() {
        //记录日志
        log.info("各个状态的订单数量统计");
        //业务:获取各个订单状态的数量
        OrderStatisticsVO orderStatisticsVO = ordersService.statistics();//statistics统计
        //返回统一的响应结果
        return Result.success(orderStatisticsVO);
    }

    /**
     * ## 查询订单详情
     * <p>
     * <a id=查询订单详情> </a>
     * <p>
     * ### 基本信息
     * <p>
     * **Path：** /admin/order/details/{id}
     * <p>
     * **Method：** GET
     * <p>
     * **接口描述：**
     * <p>
     * <p>
     * ### 请求参数
     * <p>
     * **路径参数**
     * <p>
     * | 参数名称 | 示例 | 备注   |
     * | -------- | ---- | ------ |
     * | id       | 101  | 订单id |
     * <p>
     * ## 派送订单
     */
    @ApiOperation(value = "查询订单详情", notes = "根据订单id查询订单详情")
    @GetMapping("/details/{id}")
    public Result<OrderVO> orderDetails(@PathVariable("id") Long id) {
        //记录日志
        log.info("查询订单详情,id={}", id);
        //业务:根据订单id查询订单详情
        OrderVO orderVO = ordersService.queryOrderDetails(id);//details查询
        //返回统一的响应结果
        return Result.success(orderVO);
    }


    /**
     * ## 接单
     *
     * <a id=接单> </a>
     * <p>
     * ### 基本信息
     * <p>
     * **Path：** /admin/order/confirm
     * <p>
     * **Method：** PUT
     * <p>
     * **接口描述：**
     *
     * <p>
     * ### 请求参数
     * <p>
     * **Headers**
     * <p>
     * | 参数名称     | 参数值           | 是否必须 | 示例 | 备注 |
     * | ------------ | ---------------- | -------- | ---- | ---- |
     * | Content-Type | application/json | 是       |      |      |
     * <p>
     * **Body**
     * <p>
     * | 参数名称 | 示例 | 备注   |
     * | id | ---- | 订单ID|
     * <p>
     * ### 返回数据
     */
    @ApiOperation(value = "接单", notes = "接单-修改订单状态为待派送")

    @PutMapping("/confirm")
    public Result confirm(@RequestBody OrdersDTO ordersDTO) {
        //记录日志
        log.info("接单,id={}", ordersDTO);
        //业务:修改订单状态为待派送
        ordersService.confirm(ordersDTO);//confirm接单
        //返回统一的响应结果
        return Result.success("接单成功");
    }

    /**
     * ## 拒单-拒绝接单
     * <p>
     * <a id=拒单> </a>
     * <p>
     * ### 基本信息
     * <p>
     * **Path：** /admin/order/rejection
     * <p>
     * **Method：** PUT
     * <p>
     * **接口描述：**
     * <p>
     * <p>
     * ### 请求参数
     * <p>
     * **Headers**
     * <p>
     * | 参数名称     | 参数值           | 是否必须 | 示例 | 备注 |
     * | ------------ | ---------------- | -------- | ---- | ---- |
     * | Content-Type | application/json | 是       |      |      |
     * <p>
     * **Body**
     * <p>
     * <p>
     * <p>
     * ### 返回数据
     */
    @ApiOperation(value = "拒单-拒绝接单", notes = "拒单-修改订单状态为退款,支付状态为退款,更新拒单原因")

    @PutMapping("/rejection")
    public Result<String> rejection(@RequestBody OrdersRejectionDTO ordersRejectionDTO) throws Exception {
        //记录日志
        log.info("拒单-拒绝接单,ordersRejectionDTO={}", ordersRejectionDTO);
        //业务:修改订单状态为退款,支付状态为退款,更新拒单原因
        ordersService.rejection(ordersRejectionDTO);//rejection拒单
        //返回统一的响应结果
        return Result.success("拒单成功");
    }

    /**
     * **Path：** /admin/order/cancel
     * <p>
     * **Method：** PUT
     * <p>
     * **接口描述：**
     *
     * <p>
     * ### 请求参数
     * <p>
     * **Headers**
     * <p>
     * | 参数名称     | 参数值           | 是否必须 | 示例 | 备注 |
     * | ------------ | ---------------- | -------- | ---- | ---- |
     * | Content-Type | application/json | 是       |      |      |
     * <p>
     * **Body**
     * <p>
     * ### 返回数据
     */
    @ApiOperation("订单取消-根据订单ID和订单取消原因修改订单状态为取消,修改取消时间,修改取消原因,修改支付状态为退款")
    @PutMapping("/cancel")
    public Result<String> cancel(@RequestBody OrdersCancelDTO ordersCancelDTO) throws Exception {
        //记录日志
        log.info("订单取消,ordersDTO={}", ordersCancelDTO);
        //业务:修改订单状态为取消,修改取消时间,修改取消原因,修改支付状态为退款
        ordersService.cancel(ordersCancelDTO);//cancel取消订单
        //返回统一的响应结果
        return Result.success("订单取消成功");
    }

    /**
     * ## 派送订单
     * <p>
     * <a id=派送订单> </a>
     * <p>
     * ### 基本信息
     * <p>
     * **Path：** /admin/order/delivery/{id}
     * <p>
     * **Method：** PUT
     * <p>
     * **接口描述：**
     * <p>
     * <p>
     * ### 请求参数
     * <p>
     * **路径参数**
     * <p>
     * | 参数名称 | 示例 | 备注   |
     * | -------- | ---- | ------ |
     * | id       | 101  | 订单id |
     * <p>
     * ### 返回数据
     * <p>
     * ## 订单搜索
     */
    @ApiOperation(value = "派送订单", notes = "根据订单id修改订单状态为派送中")
    @PutMapping("/delivery/{id}")
    public Result<String> delivery(@PathVariable("id") Long id) {
        //记录日志
        log.info("派送订单,id={}", id);
        //业务:修改订单状态为派送中
        ordersService.delivery(id);//delivery派送订单
        //返回统一的响应结果
        return Result.success("派送订单成功");
    }


    /**
     * ### 基本信息
     *<p>
     * **Path：** /admin/order/complete/{id}
     *<p>
     * **Method：** PUT
     *<p>
     * **接口描述：**
     *<p>
     * ### 请求参数
     *<p>
     * **Headers**
     *<p>
     * | 参数名称     | 参数值           | 是否必须 | 示例 | 备注 |
     * | ------------ | ---------------- | -------- | ---- | ---- |
     * | Content-Type | application/json | 是       |      |      |
     *<p>
     * **路径参数**
     *<p>
     * | 参数名称 | 示例 | 备注   |
     * | -------- | ---- | ------ |
     * | id       | 101  | 订单id |
     *<p>
     * ### 返回数据
     */
    @ApiOperation(value = "订单完成", notes = "根据订单id修改订单状态为完成,送达时间为当前时间")
    @PutMapping("/complete/{id}")
    public Result<String> complete(@PathVariable("id") Long id) {
        //记录日志
        log.info("订单完成,id={}", id);
        //业务:修改订单状态为完成,送达时间为当前时间
        ordersService.complete(id);//complete订单完成
        //返回统一的响应结果
        return Result.success("订单完成成功");
    }

}
